home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <TNB.H>
- #include <pcmlib.h>
- #include "cd2pcm.h"
- #include "extern.h"
-
- static char *REQUEST_MSG[17] = {
- "No Se(0): 装置には、異常は、なかった\n",
- "Recovered Error (1): 装置自体のリトライ機能によりコマンドが正常に終了した\n",
- "Not Ready (2): 装置自体に異常が発生し、オペレータの介入が必要であることを示"
- "す\n",
- "Medium Error (3): リード/ライト動作時において媒体に起因するエラーが発生し、"
- "リトライでエラーが回復できなかった\n",
- "Hardware Error (4): 装置のハードウェアに障害が発生し、コマンドの実行が正常終"
- "了しなかった\n",
- "Illegal Request(5):イニシエータからのコマンド・データに異常があり、コマンドの"
- "実行ができなかった\n",
- "Unit Attention (6): 装置がリセットされたことを示す。又メディアが入れ換えられた"
- "ことも示す\n",
- "Write Protected (7): ライト・プロテクト状態にあるときにライト動作を含むコマンド"
- "を受け取ったことを示す\n",
- "Blank Check (8): 読みだし中にブランク領域になった。又は、書き込み中にブランク領"
- "域でない領域になった\n",
- "Vendor Unique (9): メーカーごとに自由に使用可\n",
- "Copy Aborted (A): Copy,Compare,Copy & Verifyコマンドがデバイス異常により中止し"
- "た\n",
- "Aborted Command (B): ターゲットがイニシエータからのコマンドをアボートしたこと"
- "を示す\n",
- "Equal (C): Searchコマンドで一致を検出した\n",
- "Volume Overflow (D): データがバッファに残っているのに、デバイスは最終ブロック"
- "に達してしまった\n",
- "Miscompare (E): ソースデータとメディアから読み出したデータが一致しない\n",
- "(F): 将来の拡張用\n",
- "センス・コマンドでエラーが、発生しました。\n"
- };
-
- static char MODE_TBL[2][12] = {
- /* SONY CDU-561 モード変更 */
- { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x30 },
- /* 東芝 XM-3401TA audio track 2352 byte */
- { 0x00, 0x00, 0x00, 0x08, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x30 }
- };
- static char MODE_TBL_N[2][12] = {
- /* SONY CDU-561 モードもどし */
- { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00 },
- /* 東芝 XM-3401TA audio track 2048 byte */
- { 0x00, 0x00, 0x00, 0x08, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00 }
- };
-
- static char SPEED_MODE_TBL[3][16] = {
- /* 標準速度 */
- { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x30,
- 0x31, 0x02, 0x00, 0x00 },
- /* 倍速 */
- { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x30,
- 0x31, 0x02, 0x01, 0x00 },
- /* 最大速度 */
- { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x30,
- 0x31, 0x02, 0xff, 0x00 }
- };
-
- static char *MODE_MES[3] = {
- "標準速度 ", "倍速 ", "最大速度 "
- };
-
- unsigned char erod[2352]; /* errod用ワーク */
- unsigned char work[2352]; /* 1度読みワーク */
- unsigned char work2[2352]; /* 2度読みワーク */
- unsigned char work3[2352]; /* 3度読みワーク */
-
- /****************************************************************/
- /* オーディオデータを取り込む */
- /****************************************************************/
- void cdda2pcm( int music_no, int tstart, int tend )
- {
- unsigned char buf[256]; /* ローカルワーク */
- int start,end,leadout_address,sta_t,end_t,lng_t,fc;
- int min,max,ll,sss;
- int len,sense,err_cnt;
- int i,frame_cnt; /* loop count */
- int buffer_size;
- char *buffer_ptr; /* バッファアドレス */
- int escchk=0;
- int cvf=0;
- unsigned char *pp;
-
- /*--- PCMLIB 初期化 ---*/
- PCMFREQ_INIT(); //PCMFREQ();
- PCMFFREQ_INIT(); //PCMFFREQ();
- PCMFREQVOL_INIT(); //PCMFREQVOL();
- PCMFFREQVOL_INIT(); //PCMFFREQVOL();
- P162PCM_INIT(); //P162PCM();
- PTOA_MAKE_BUFFER(); //PTOA_EXEC();
- PTOA_INIT();
-
- trans_size=0; /* 転送サイズ */
- trans_time=0; /* 転送のみ時間 */
-
- /*--- 取り込みモード変更 ---*/
- //S_MODESENSE( 0x3f, 12, SCSI_ID, MT_bak );
- i=S_MODESELECT( PF, 12, SCSI_ID, MODE_TBL[CDROM_DRIVE] );
- if ( i==2 ){
- if ( S_REQUEST( 22, SCSI_ID, buf ) == 0 )
- sense = (unsigned int)( buf[2] & 0x0f );
- else sense = 16;
- if ( sense!=6 ){
- printf("Check Condition!! Sense Key=%d(ASC=%02X,ASCQ=%02X)\n",sense,buf[12],buf[13]);
- printf( REQUEST_MSG[sense] );
- if ( inqu_sw!=0 && CDROM_DRIVE==TOSHIBATYPE )
- printf(" TOSHIBA系 Read CD-DA コマンドはサポートしていないようです。\n");
- if ( errjmp_fg==0 ) /* 致命的でないエラーは無視します。*/
- EndtDisp(1);
- }
- } else if ( i!=0 ){
- printf("エラーが出ました。モードは変更出来ませんでした。\n");
- if ( errjmp_fg==0 ) /* 致命的でないエラーは無視します。*/
- EndtDisp(1);
- }
- /*--- 取り込み速度変更(MMC) ---*/
- if ( cdspeed>0 ){
- i=SetSpeed( 706*cdspeed/4 );
- if ( i!=0 )
- printf("Set Speed Command でエラーが出ました。\n");
- if ( i==2 ){
- if ( S_REQUEST( 22, SCSI_ID, buf ) == 0 )
- sense = (unsigned int)( buf[2] & 0x0f );
- else sense = 16;
- if ( sense==5 ){
- if ( buf[12]==0x20 )
- printf("この CD-ROM ドライブが対応していない可能性があります。\n");
- else printf("この CD-ROM ドライブの対応範囲を越えている可能性があります。\n");
- if ( errjmp_fg==0 ) /* 致命的でないエラーは無視します。*/
- EndtDisp(1);
- } else if ( sense!=6 ){
- printf("Check Condition!! Sense Key=%d(ASC=%02X,ASCQ=%02X)\n",sense,buf[12],buf[13]);
- printf( REQUEST_MSG[sense] );
- if ( errjmp_fg==0 ) /* 致命的でないエラーは無視します。*/
- EndtDisp(1);
- }
- } else if ( i!=0 ){
- if ( errjmp_fg==0 ) /* 致命的でないエラーは無視します。*/
- EndtDisp(1);
- }
- }
- /*--- SONY系 アクセス速度変更 ---*/
- if ( cd_speed != -1 && CDROM_DRIVE == CD_CDU561 ){
- /* CD 速度変更 */
- i=S_MODESELECT( PF, 16, SCSI_ID, SPEED_MODE_TBL[cd_speed] );
- if ( i==0 ){
- printf("CD-ROMアクセス速度は、");
- printf(MODE_MES[cd_speed]);
- printf("に変更されました。\n");
- } else if ( i==2 ){
- if ( S_REQUEST( 22, SCSI_ID, buf ) == 0 )
- sense = (unsigned int)( buf[2] & 0x0f );
- else sense = 16;
- if ( sense!=6 ){
- printf("Check Condition!! Sense Key=%d(ASC=%02X,ASCQ=%02X)\n",sense,buf[12],buf[13]);
- printf( REQUEST_MSG[sense] );
- if ( errjmp_fg==0 ) /* 致命的でないエラーは無視します。*/
- EndtDisp(1);
- }
- } else {
- printf("エラーが出ました。モードは変更出来ませんでした。\n");
- if ( errjmp_fg==0 ) /* 致命的でないエラーは無視します。*/
- EndtDisp(1);
- }
- }
-
- /*--- メモリーのチェック ---*/
- len = 2352; /* 44.1 kHz 16 bit streo 1/75 s */
- buffer_size = (int)MALLOC( 0x00ffffff );
- buffer_size = buffer_size & 0x00ffffff;
- if ( buffer_size < len ){
- /* メモリが全然足らん */
- printf("メモリーが、足りないので、実行できません。\n");
- EndtDisp(1);
- }
- /*--- メモリー確保 ---*/
- buffer_ptr = MALLOC( buffer_size ); /* エラーが返ってこない */
- if ( pcm_mode!=CONVERT_A88 ){
- frame_cnt = (buffer_size-2) / len ; /* フレーム数を求める */
- } else {
- frame_cnt = ((buffer_size-2) / len)/4 ; /* フレーム数を求める */
- }
- if ( buf_size != -1 ){
- buf_size = buf_size * 75; /* 指定されたフレーム数 */
- if ( buf_size > frame_cnt ){
- printf(" %d秒分のメモリが確保出来ませんでした。\n",buf_size/75);
- printf(" %d秒分のメモリで処理を行います。\n",frame_cnt/75);
- } else
- frame_cnt = buf_size;
- }
- CDPCM_ptr = buffer_ptr; /* CD のバッファアドレスセット */
- CDPCMM_ptr = CDPCM_ptr+((buffer_size/2)&0xFFFFFFFE); /* monoになった時うしろ半分はワークに*/
- /*--- CD をチェック! ---*/
- if ( RedTOC( &leadout_address, &min, &max ) != 0 ){
- printf(" Read TOC でエラーが、でました。\n");
- EndtDisp(1);
- }
- /*--- 取り込みアドレス計算 ---*/
- if ( music_no == -1 ){
- if ( adr2time(leadout_address) - 1 < tstart ){
- printf("読み込み開始時間の設定が大きすぎます。\n");
- EndtDisp(1);
- }
- if ( tend == -1 )
- tend = adr2time(leadout_address) -1;
- if ( adr2time(leadout_address) -1 +1 < tend ){
- printf("読み込み終了時間の設定が大きすぎます。\n");
- EndtDisp(1);
- }
- start = tstart;
- end = tend + 1;
- } else {
- if ( Music_inf( music_no, &start ) != 0 ){
- printf(" Music_inf でエラーが、でました。\n");
- EndtDisp(1);
- }
- start = adr2time( start );
- if ( music_no == max ){
- end = adr2time( leadout_address )-1;
- } else {
- if ( Music_inf( music_no+1 , &end ) != 0 ){
- printf("Start Track Address or ReadTOC Command error のため読み込み出来ませんでした。\n");
- EndtDisp(1);
- }
- end = adr2time( end );
- }
- }
-
- /*--- ファイルを作成する ---*/
- if ( test_fg==0 && merc_fg==0 ){
- hdl = CREATE( outfile, 0x20 );
- if ( hdl < 0 ){
- printf("ファイルの作成に失敗しました。\n");
- printf("errcode = %d\n",hdl );
- EndtDisp(1);
- }
- if ( adpcm_flg == 2 ){
- /*-- WAV のヘッダ制作 --*/
- char buf[64];
- WRITE(hdl,buf,44); //ゴミを書いておく
- }
- } else {
- if ( merc_fg ){
- printf(" まーきゅりー演奏 mode\n");
- } else {
- printf(" Read CD-DA test mode\n");
- }
- }
- write_size = 0; /* DISKに書き込んだサイズ*/
- C_CUROFF(); /* カーソルを消去する */
- printf("\x1B""0");
- /*------ オーディオデータ取り込む ------*/
- sta_t = bin2time( start + 75 * 2 );
- end_t = bin2time( end + 75 * 2 -1 );
- lng_t = bin2time( (end-start) );
- if ( music_no != -1 ){
- char *s;
- if ( CDC_ID==SCSI_ID )
- s=CDCTNAME(music_no);
- else s=0;
- if ( s==0 )
- printf(" %d 曲目を読み込みます。\n",music_no );
- else printf(" %d 曲目[%s]を読み込みます。\n",music_no,NameCenter(s) );
- }
- printf("取込時間 %2d分%02d秒%02d~%2d分%02d秒%02d (%2d分%02d秒%02d)\n\n",
- ( sta_t >> 16 ) & 0xff, ( sta_t >> 8 ) & 0xff, sta_t & 0xff,
- ( end_t >> 16 ) & 0xff, ( end_t >> 8 ) & 0xff, end_t & 0xff,
- ( lng_t >> 16 ) & 0xff, ( lng_t >> 8 ) & 0xff, lng_t & 0xff
- );
- srand(ONTIME());
- memset( buf, 0x00, 12 );
- sss=start;
- cvf=0;
- if ( pcm_mode!=0 && pcm_mode!=CONVERT_PCMA )
- sct_fg = 0; /* SCSITAI 使用フラグ*/
- for(i=0;start<end;){
- pp=(unsigned char*)&CDPCM_ptr[i*2352];
- if ( dma_fg!=0 && mach2_fg==0 && (pcm_mode==0 || pcm_mode==CONVERT_PCMA) ){
- // DMA 転送で Mach2 でなくて pcms | pcma の時
- pp++; // 奇数に(笑)
- }
- CURDRV();
- if ( CDROM_DRIVE == CD_CDU561 ){
- /* SONY CDU-561 音声トラック読み込みコマンド */
- buf[0] = 0xd8; // 1101_1000 グループ 6
- buf[2] = (start >> 24)&0xff;
- buf[3] = (start >> 16)&0xff;
- buf[4] = (start >> 8)&0xff;
- buf[5] = (start )&0xff;
- buf[8] = 0;
- buf[9] = 1; /* 1 block */
- } else {
- /* 東芝 XM-3401TA 音声トラック読み込みコマンド */
- buf[0] = 0x28; // 拡張リードコマンド 0010_8000 グループ 1
- buf[2] = (start >> 24)&0xff;
- buf[3] = (start >> 16)&0xff;
- buf[4] = (start >> 8)&0xff;
- buf[5] = (start )&0xff;
- buf[7] = 0;
- buf[8] = 1; /* 1 block */
- }
- sta_t = bin2time( start + 75 * 2 );
- if ( check_fg == 0 ){
- printf_( CFC CUP );
- /*--- 読み込む ---*/
- if ( secone_fg==0 ){
- ll=(end-start);
- if ( ll>65535 )
- ll=65535;
- if ( ll>(frame_cnt-i) ){
- ll=(frame_cnt-i);
- cvf=1;
- }
- if ( CDROM_DRIVE == CD_CDU561 ){
- buf[8]=ll/0x100;
- buf[9]=ll&0xFF;
- } else {
- buf[7]=ll/0x100;
- buf[8]=ll&0xFF;
- }
- end_t = bin2time( start+75*2+ll-1 );
- lng_t = bin2time( ll );
- printf_("処理時間 %2d分%02d秒%02d~%2d分%02d秒%02d (%2d分%02d秒%02d)\n",
- ( sta_t >> 16 ) & 0xff, ( sta_t >> 8 ) & 0xff, sta_t & 0xff,
- ( end_t >> 16 ) & 0xff, ( end_t >> 8 ) & 0xff, end_t & 0xff,
- ( lng_t >> 16 ) & 0xff, ( lng_t >> 8 ) & 0xff, lng_t & 0xff
- );
- printf_(" ★Read CD-DA" CFC "\n" CUP);
- } else {
- ll=1;
- printf_("処理時間 %2d分%02d秒%02d\n",
- ( sta_t >> 16 ) & 0xff, ( sta_t >> 8 ) & 0xff, sta_t & 0xff
- );
- }
-
- // if ( mbr7f )
- // l1=3;
- // else l1=1;
- // for(;l1>0;l1--)
- // ReadCDDA(12, buf, 2352*ll,pp);
-
- if ( mbr7f ){
- S_REZEROUNIT(SCSI_ID);
- S_SEEK(0,SCSI_ID);
- }
-
- ReadCDDA(12, buf, 2352*ll,pp);
-
- } else {
- printf_( CUP );
- /*--- チェックしながら読み込む ---*/
- printf_("処理時間 %2d分%02d秒%02d\n",
- ( sta_t >> 16 ) & 0xff, ( sta_t >> 8 ) & 0xff, sta_t & 0xff
- );
- ll=1;
- err_cnt = 1;
- ReadCDDA(12,buf,2352,work);
- for(;;) {
- while( (BITSNS(0xA)&(1<<5))!=0 ); //[XF1]押されていたら待つ
- ReadCDDA(12,buf,2352,work2);
- if ( check_fg==1 ){
- fc=memfcmp( work, work2, 2352 ,fcmppr );
- if ( fc==0 ){
- printf_(" ★1度目と2度目が一致しました。%d回目" CFC "\n" CUP,err_cnt);
- memcpy( pp,work,2352 );
- break;
- } else if ( fc==1 ){
- printf_(" ★1度目と2度目が%d%一致しました。%d回目" CFC "\n" CUP,fcmppr,err_cnt);
- memcpy( pp,work,2352 );
- break;
- }
- }
- if ( err_cnt>=40 ){
- WW((rand()%50)+8);
- } else if ( err_cnt>=20 && (err_cnt%8)==0 ){
- /*8回に1回休み*/
- WW(45);
- }
- while( (BITSNS(0xA)&(1<<5))!=0 ); //[XF1]押されていたら待つ
- ReadCDDA(12,buf,2352,work3);
- if ( check_fg==1 ){
- fc=memfcmp( work, work3, 2352,fcmppr );
- if ( fc== 0 ){
- printf_(" ★1度目と3度目が一致しました。%d回目" CFC "\n" CUP,err_cnt);
- memcpy( pp,work,2352 );
- break;
- } else if ( fc== 1 ){
- printf_(" ★1度目と3度目が%d%一致しました。%d回目" CFC "\n" CUP,fcmppr,err_cnt);
- memcpy( pp,work,2352 );
- break;
- }
- fc=memfcmp( work2, work3, 2352,fcmppr );
- if ( fc== 0 ){
- printf_(" ★2度目と3度目が一致しました。%d回目" CFC "\n" CUP,err_cnt);
- memcpy( pp,work2,2352 );
- break;
- } else if ( fc== 1 ){
- printf_(" ★3度目と3度目が%d%一致しました。%d回目" CFC "\n" CUP,fcmppr,err_cnt);
- memcpy( pp,work,2352 );
- break;
- }
- } else {
- //マニアック向け
- if ( memfcmp( work,work2,2352,fcmppr )==0 && memfcmp( work,work3,2352,fcmppr )==0 ){
- printf_(" ★3つ連続で一致しました。%d回目" CFC "\n" CUP,err_cnt);
- memcpy( pp,work,2352 );
- break;
- }
- }
- err_cnt++;
- if ( check_fg==1 && err_cnt>=5+1 && (BITSNS(0xE)&1)==0 ){
- printf_(" ★リトライオーバーです。最初のデータを有効とします。" CFC "\n" CUP);
- memcpy( pp, work,2352 );
- break;
- }
- printf_(" ★Checking...%5d回目"CFC"\n"CUP,err_cnt);
- memcpy( work,work3,2352 );
- if ( err_cnt>=40 ){
- WW((rand()%68)+8);
- } else if ( err_cnt>=20 ){
- if ( (err_cnt%4)==0 ){
- /*4回に1回休み*/
- WW(68);
- }
- } else if ( err_cnt>=10 && (err_cnt%10)==0 ){
- /*10回に1回休み*/
- WW(68);
- }
- if ( (BITSNS(0)&2)!=0 ){ //[ESC]押されていたら
- escchk=1;
- break;
- }
- }
- if ( escchk!=0 )
- break;
- }
- i+=ll;
- if ( (BITSNS(0)&2)!=0 ){ //[ESC]押されていたら
- escchk=1;
- break;
- }
- if ( i==frame_cnt || cvf ){
- len = 2352*i;
- i = 0;
- convert( len );
- cvf=0;
- }
- start+=ll;
- if ( (BITSNS(0)&2)!=0 ){ //[ESC]押されていたら
- escchk=1;
- break;
- }
- }
- printf("\x1B""1");
- if ( escchk!=0 )
- printf( CUP CFC " ☆☆☆読み込みを中止します。\n");
- if ( i!=0 ){
- /* 残りを書き込む */
- len = 2352 * i;
- convert( len );
- }
- if ( adpcm_flg==2 && test_fg==0 ){
- /*-- WAV のヘッダ補正 --*/
- static char header1[]= "RIFF";
- static char header2[]={
- 'W', 'A', 'V', 'E', 'f', 'm', 't',0x20,0x10,0x00,
- 0x00,0x00,0x01,0x00,0x01, 0x00,0x22,0x56,0x00,0x00,
- 0x22,0x56,0x00,0x00,0x01, 0x00,0x08,0x00, 'd', 'a',
- 't', 'a'
- };
- char buf[8];
- int j;
- header2[20-8]=1; /*1=PCM 0x20=ADPCM */
- header2[22-8]=2; /*1=モノラル 2=ステレオ*/
- header2[34-8]=0x10; /*0x08=8ビット 0x10=16ビット*/
- header2[32-8]=1; /*わからない ;_; */
- /*サンプリング周波数*/
- header2[24-8]= pcm_rate & 0xFF;
- header2[25-8]= pcm_rate / 0x100;
- j = write_size + 36;
- SEEK( hdl, 0, 0);
- WRITE( hdl,header1,4);
- buf[0]= j & 0xff;
- buf[1]= (j >> 8) & 0xff;
- buf[2]= (j >> 16) & 0xff;
- buf[3]= (j >> 24) & 0xff;
- WRITE(hdl,buf,4);
- WRITE(hdl,header2,32);
- buf[0]= write_size & 0xff;
- buf[0]=(write_size >> 8) & 0xff;
- buf[0]=(write_size >> 16) & 0xff;
- buf[0]=(write_size >> 24) & 0xff;
- WRITE(hdl,buf,4);
- }
- if ( test_fg==0 ){
- CLOSE( hdl );
- printf( CUP CFC "\nオーディオデータの読み込みは");
- } else {
- printf( CUP CFC "\nオーディオデータのテスト読みは");
- }
- if ( escchk==0 ){
- printf("終了しました。\n");
- } else {
- printf("途中終了しました。\n");
- while( (BITSNS(0)&2)!=0 ); //[ESC]押されていたら待つ
- }
- if ( retry_fg!=0 ){ /* -retry[n] 読み込みエラーが出た場合[n]回挑戦*/
- if ( retry_mx>1 )
- printf(" 最大リトライ数 %d\n",retry_mx);
- }
- if ( errjmp_fg!=0 ){ /* 致命的でないエラーは無視します。*/
- printf(" 非致命的エラー数 %d\n",errjmp_mx);
- }
- /* 時間を表示 */
- if ( trans_time>50 && secone_fg==0 ){
- printf(" ★Read CD-DA : %.1fKB/s < %.2f倍速 >\n",
- (((double)trans_size)*100.*150)/(((double)trans_time)*75.),
- (((double)trans_size)*100.)/(((double)trans_time)*75.)
- );
- }
- C_CURON();
- /*---ブロックサイズを戻す---*/
- i=S_MODESELECT( PF, 12, SCSI_ID, MODE_TBL_N[CDROM_DRIVE] );
- if ( i==2 ){
- if ( S_REQUEST( 22, SCSI_ID, buf ) == 0 )
- sense = (unsigned int)( buf[2] & 0x0f );
- else sense = 16;
- if ( sense!=6 ){
- printf("Check Condition!! Sense Key=%d(ASC=%02X,ASCQ=%02X)\n",sense,buf[12],buf[13]);
- printf( REQUEST_MSG[sense] );
- //if ( inqu_sw!=0 && CDROM_DRIVE==TOSHIBATYPE )
- // printf(" TOSHIBA系 Read CD-DA コマンドはサポートしていないようです。\n");
- //if ( errjmp_fg==0 ) /* 致命的でないエラーは無視します。*/
- // EndtDisp(1);
- }
- } else if ( i!=0 ){
- printf("エラーが出ました。ブロックサイズが変更されたままです。\n");
- //if ( errjmp_fg==0 ) /* 致命的でないエラーは無視します。*/
- // EndtDisp(1);
- }
- SetSpeed( 0xFFFF ); // 最大速度にしておく。
- }
- /*++*/
- void WW(int w) // 1/100s
- {
- int i,j;
- i=ONTIME();
- for(;;){
- if ( (j=ONTIME()-i)<0 )
- j+=8639999;
- if ( j>=w )
- break;
- }
- }
- /****************************************/
- /* READ CD-DA */
- /****************************************/
- void ReadCDDA(cml,com,lg,ad)
- int cml,lg;
- char *com,*ad;
- {
- int i,n,l,rc,sense,b,i8;
- unsigned char buf[256];
- int t1,t2;
- n=retry_fg;
- sense=-1;
- if ( n<=0 ) n=1;
- for(l=0;l<n;l++){
- for(i8=0;i8<10;i8++){
- b=BREAKCK(-1);
- BREAKCK(2);
- t1=ONTIME(); // 開始時間
- rc=scsi_cmd__(cml,com,lg,ad);
- t2=ONTIME(); // 終了時間
- BREAKCK(b);
- if ( rc!=8 )
- break;
- }
- if ( rc==0 ){
- //問題無し
- if ( errjmp_fg && errod_fg && secone_fg )
- memcpy( erod,ad,2352 );
- if ( retry_mx<l )
- retry_mx=l; /* エラーの最大リトライ数 */
- trans_size+=(lg/2352); /* 転送サイズ */
- i=t2-t1;
- if ( i<0 )
- i+=8640000;
- trans_time+=i; /* 転送のみ時間 */
- return;
- }
- if ( rc==0x02 ){
- /* チェック・コンディション */
- if ( S_REQUEST( 22, SCSI_ID, buf ) == 0 )
- sense = (unsigned int)( buf[2] & 0x0f );
- else sense = 16;
- if ( sense==0xB || sense==0x6 ){
- //0x0B ; ターゲットはコマンドの実行を異
- // 常終了したはスルー(PD-DRIVE以外
- // で出たのはしらない)
- //0x06 ; 交換されていたらでる。問題なし
- if ( errjmp_fg && errod_fg && secone_fg )
- memcpy( erod,ad,2352 );
- if ( retry_mx<l )
- retry_mx=l; /* エラーの最大リトライ数 */
- n++;
- continue;
- } else {
- printf("\nCheck Condition!! Sense Key=%d(ASC=%02X,ASCQ=%02X)\n",sense,buf[12],buf[13]);
- }
- } else {
- sense=-1;
- if ( inqu_sw!=0 && CDROM_DRIVE==CD_CDU561 )
- printf(" \nSONY系 Read CD-DA コマンドはサポートしていないようです。 (%d回)\n" CUP CUP,l+1);
- else printf_("\nRead CD-DA Command Err!! (%d回)\n" CUP CUP,l+1);
- }
- if ( mbr7f ){
- S_REZEROUNIT(SCSI_ID);
- S_SEEK(0,SCSI_ID);
- }
- }
- if ( errjmp_fg ){ /* 致命的でないエラーは無視します。*/
- errjmp_mx++; /* 致命的でないエラーの数 */
- /*エラーなので、00を埋めて返す*/
- if ( errod_fg && secone_fg ){
- memcpy( ad,erod,2352 );
- return;
- }
- memset( ad, 0x00, lg );
- return;
- }
- printf("\n\n");
- if ( sense>=0 )
- printf( REQUEST_MSG[sense] );
- if ( test_fg==0 )
- CLOSE(hdl);
- EndtDisp(1);
- }
- /*************************************
- 内容比較
- [戻り値] 0 ; 一致
- -1 ; 全然違う
- 1 ; n%一致
- *************************************/
- int memfcmp(ad1,ad2,l,n)
- unsigned char *ad1,*ad2;
- int l,n;
- {
- int ll,ep;
- ll=l;
- ep=0;
- for(;l>0;l--){
- if ( *ad1++==*ad2++ ){
- ep++;
- } else {
- if ( n==0 )
- return(-1);
- }
- }
- if ( ep==ll )
- return(0);
- if ( ep*100/ll>n )
- return(1);
- return(-1);
- }